package com.hailiang.study.javase.java.util;

import org.junit.Test;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Map.compute()
 */
public class Map_compute {

    /**
     * put与compute：
     *      不论key是否存在，强制用value覆盖进去。
     *      区别：put返回旧value或null，compute返回新的value
     */
    @Test
    public void testCompute() {
        Map<String, String> map = new LinkedHashMap<>();

        // put返回旧value或null
        String oldValue = map.put("program", "Java");
        System.out.println("1. put方法：" + oldValue);
        oldValue = map.put("program", ".NET");
        System.out.println("2. put方法：" + oldValue);
        System.out.println(map);
        System.out.println("=================分界线===================");


        Map<String, String> computeMap = new LinkedHashMap<>();
        String newValue = computeMap.compute("language", (key, value) -> {return "key=" + key + ", value=" + value;});
        System.out.println(newValue);
        /*
         * 下面compute方法中的
         *      key：    当前compute的key值
         *      value：  如果key=language对应的value存在，则返回对应的value（老的值），如果key在Map中不存在，则该value值为null
         */
        // 在这里computeMap中key=language已存在，故方法compute中第二个参数(key, value)是对应上一次老的key和value值
        newValue = computeMap.compute("language", (key, value) -> {return "key2=" + key + ", value2=" + value;});
        System.out.println(newValue);

    }
}
